//
//  UIViewController+Swizzling.m
//  ZLClient
//
//  Created by lizhu on 2017/6/26.
//  Copyright © 2017年 zhuli. All rights reserved.
//

#import "UIViewController+Swizzling.h"
#import <objc/message.h>

@implementation UIViewController (Swizzling)
/**
 参考资料： http://www.qidiandasheng.com/2016/05/15/runtime-demo/
 */

+ (void)load{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        SEL originalSelector=NSSelectorFromString(@"dealloc");
        SEL swizzledSelector=@selector(deallocSwizzle);
        
        Class class=[self class];
        
        Method originalMethod=class_getInstanceMethod(class, originalSelector);
        Method swizzledMethod=class_getInstanceMethod(class, swizzledSelector);
        
        
        /**如果直接通过method_exchangeImplementations来进行的话，可能原有类里并没有originalSelector所代表的方法，你直接进行了交换，这是我们不希望看到的。
         因此通过addMethod来判断，如果加成功了，说明原先这个函数在原有类中并不存在，我们现在添加了，只要再把swizzleSelector指向原有函数即可；而如果没成功，说明这个函数在原有类中存在了，我们直接替换也不会有影响。
         */
        BOOL success=class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));
        if (success) {
            class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
        }else{
            method_exchangeImplementations(originalMethod, swizzledMethod);
        }
    });
}


/**
 死循环问题,我们简单看一下下面的代码,好像是死循环了。但是不要担心,其实不会死循环。因为这里在调用[self deallocSwizzle]的时候其实函数已经被交换了,真正调用的其实是[self dealloc]
 */
- (void)deallocSwizzle{
    NSLog(@"%@被销毁了",self);
    [self deallocSwizzle];
}
@end
